#include "main.h"
#include "motor.h"
#include "tim.h"

//Motor motors = 
//{.id = 1, .direction = 0, .speed = 0, .htim = &htim8, .Channel = TIM_CHANNEL_1, .pin1 = {.GPIOx = GPIOC, .GPIO_Pin = GPIO_PIN_0}, .pin2 = {.GPIOx = GPIOC, .GPIO_Pin = GPIO_PIN_1}};

//2，3反向
ControlChannel channels[4] = 
{
    {.pin1 = {.GPIOx = motor11_GPIO_Port, .GPIO_Pin = motor11_Pin}, .pin2 = {.GPIOx = motor12_GPIO_Port, .GPIO_Pin = motor12_Pin}, .htim = &htim8, .Channel = TIM_CHANNEL_1},
    {.pin2 = {.GPIOx = motor21_GPIO_Port, .GPIO_Pin = motor21_Pin}, .pin1 = {.GPIOx = motor22_GPIO_Port, .GPIO_Pin = motor22_Pin}, .htim = &htim8, .Channel = TIM_CHANNEL_2},
    {.pin2 = {.GPIOx = motor31_GPIO_Port, .GPIO_Pin = motor31_Pin}, .pin1 = {.GPIOx = motor32_GPIO_Port, .GPIO_Pin = motor32_Pin}, .htim = &htim8, .Channel = TIM_CHANNEL_3},
    {.pin1 = {.GPIOx = motor41_GPIO_Port, .GPIO_Pin = motor41_Pin}, .pin2 = {.GPIOx = motor42_GPIO_Port, .GPIO_Pin = motor42_Pin}, .htim = &htim8, .Channel = TIM_CHANNEL_4},
};    

void motorInit(void)
{
    __HAL_TIM_SetCompare(&htim8, TIM_CHANNEL_1, 0);
    __HAL_TIM_SetCompare(&htim8, TIM_CHANNEL_2, 0);
    __HAL_TIM_SetCompare(&htim8, TIM_CHANNEL_3, 0);
    __HAL_TIM_SetCompare(&htim8, TIM_CHANNEL_4, 0);
    
    HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_3);
    HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_4);
}

//void motorSetSpeed(Motor *motor, int8_t speedVal)
//{
//    if(speedVal > 0)
//    {
//        motor->direction = 1;
//    }
//    else if(speedVal == 0)
//    {
//        motor->direction = 0;
//    }
//    else
//    {
//        motor->direction = -1;
//    }
//    motor->speed = abs(speedVal) * 5;
//}

//void motorRefresh(Motor *motor)
//{
//    switch (motor->direction)
//    {
//        case 1:
//        {
//            HAL_GPIO_WritePin(motor->pin1.GPIOx, motor->pin1.GPIO_Pin, GPIO_PIN_SET);
//            HAL_GPIO_WritePin(motor->pin2.GPIOx, motor->pin2.GPIO_Pin, GPIO_PIN_RESET);
//            break;
//        }
//        case 0:
//        {
//            HAL_GPIO_WritePin(motor->pin1.GPIOx, motor->pin1.GPIO_Pin, GPIO_PIN_RESET);
//            HAL_GPIO_WritePin(motor->pin2.GPIOx, motor->pin2.GPIO_Pin, GPIO_PIN_RESET);
//            break;
//        }
//        case -1:
//        {
//            HAL_GPIO_WritePin(motor->pin1.GPIOx, motor->pin1.GPIO_Pin, GPIO_PIN_RESET);
//            HAL_GPIO_WritePin(motor->pin2.GPIOx, motor->pin2.GPIO_Pin, GPIO_PIN_SET);
//            break;
//        }
//    }
//    __HAL_TIM_SetCompare(motor->htim, motor->Channel, motor->speed);
//}

void motorSetPWM(ControlChannel *channel, int pwmVal)
{
    if(pwmVal > 0)
    {
        HAL_GPIO_WritePin(channel->pin1.GPIOx, channel->pin1.GPIO_Pin, GPIO_PIN_SET);
        HAL_GPIO_WritePin(channel->pin2.GPIOx, channel->pin2.GPIO_Pin, GPIO_PIN_RESET);
        __HAL_TIM_SetCompare(channel->htim, channel->Channel, pwmVal);
    }
    else
    {
        HAL_GPIO_WritePin(channel->pin1.GPIOx, channel->pin1.GPIO_Pin, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(channel->pin2.GPIOx, channel->pin2.GPIO_Pin, GPIO_PIN_SET);
        __HAL_TIM_SetCompare(channel->htim, channel->Channel, -pwmVal);
    }
}
